// 抽象工厂模式

class MobilePhoneFactory {
    // 提供操作系统的接口
    createOS () {
        throw new Error("抽象工厂方法不允许调用，需要重写")
    } 
    // 提供硬件的接口  
    createHardWare () {
        throw new Error("抽象工厂方法不允许调用，需要重写")
    }   
}

// 具体工厂继承自抽象工厂
class FakeStarFactor extends MobilePhoneFactory {
    createOS() {
        // 提供安卓系统实例
        return new AndroidOS()
    }
    createHardWare() {
        // 提供高通硬件实例
        return new QualcommHardWare()
    }
}

// 定义操作系统这类产品的抽象产品类
class OS {
    controlHardWare() {
        throw new Error('抽象产品方法不允许直接调用，你需要将我重写！');
    }
}

// 定义具体操作系统的具体产品类
class AndroidOS extends OS {
    controlHardWare() {
        console.log("我会用安卓的方式去操作硬件")
    }
}

class AppleOS extends OS {
    controlHardWare() {
        console.log("我会用苹果的方式去操作硬件")
    }
}

// 定义手机硬件这类产品的抽象产品类
class HardWare {
    // 手机硬件的共性方法，这里提取了“根据命令运转这个共性”
    operateByOrder() {
        throw new Error('抽象产品方法不允许直接调用，你需要将我重写！');
    }
}

class QualcommHardWare extends HardWare {
    operateByOrder() {
        console.log("我会用高通的方式去运转")
    }
}

class MiHardWare extends HardWare {
    operateByOrder() {
        console.log("我会用小米的方式去运转")
    }
}
// 我的手机
const myPhone = new FakeStarFactor()
const myOS = myPhone.createOS()
const myHardWare = myPhone.createHardWare()
// 启动操作系统
myOS.controlHardWare()
// 连接硬件
myHardWare.operateByOrder()